#pragma once  
#include <memory>  
struct SDL_Window;
struct SDL_Renderer;


namespace engine
{
    namespace core
    {
        class Time;
    }
}

namespace engine
{
	namespace resource
    {
		class ResourceManager;
    }
}

namespace engine
{
    namespace render
    {
        class Renderer;
		class Camera;
    }
}

namespace engine
{
    namespace core
    {
        class GaneApp final
        {
        public:
            GaneApp();
            ~GaneApp();
            GaneApp(const GaneApp&) = delete;
            GaneApp& operator=(const GaneApp&) = delete;
            GaneApp(GaneApp&&) = delete;
            GaneApp& operator=(GaneApp&&) = delete;

            void run();                                                       //游戏主循环
			void testResourceManager(); //测试资源管理器
			void testRenderer();                      //测试渲染器
			void testCamera();                        //测试摄像机
        private:
            [[nodiscard]] bool init();                                 //初始化游戏
            void handleEvents();                                      //处理事件
            void update(float delta_time);                       //更新游戏状态
            void render();                                                 //渲染游戏画面
            void close();                                                   //关闭游戏
			bool initSDL();                                           //初始化SDL
			bool initTime();                                          //初始化时间管理器
			bool initResourceManager();                           //初始化资源管理器
			bool initRenderer();                                    //初始化渲染器
			bool initCamera();                                      //初始化摄像机
        private:
            SDL_Window* sdl_window = nullptr;            //SDL窗口对象指针
            SDL_Renderer* sdl_renderer = nullptr;         //SDL渲染器对象指针
            bool m_isRunning;                                        //游戏是否运行标志
			std::unique_ptr<engine::core::Time> m_time=nullptr;                   //时间管理对象
			std::unique_ptr<engine::resource::ResourceManager> m_resourceManager = nullptr; //资源管理器对象指针
			std::unique_ptr<engine::render::Renderer> m_renderer = nullptr; //渲染器对象指针
			std::unique_ptr<engine::render::Camera> m_camera = nullptr; //摄像机对象指针
        };
    } // namespace core  
} // namespace engine
